#!/usr/bin/env python
# Copyright cocotb contributors
# Copyright (c) 2013 Potential Ventures Ltd
# Copyright (c) 2013 SolarFlare Communications Inc
# Licensed under the Revised BSD License, see LICENSE for details.
# SPDX-License-Identifier: BSD-3-Clause
from __future__ import annotations

import logging
import os
import subprocess
import sys
from io import StringIO
from os import path, walk

from setuptools import find_packages, setup

# Note: cocotb is not installed properly yet and is missing dependencies and binaries
# We can still import other files next to setup.py, as long as they're in MANIFEST.in
# The below line is necessary for PEP517 support
sys.path.append(path.dirname(__file__))

from cocotb_build_libs import build_ext, get_ext

__version__ = "2.1.0.dev0"

max_python3_minor_version = 14
if "COCOTB_IGNORE_PYTHON_REQUIRES" not in os.environ and sys.version_info >= (
    3,
    max_python3_minor_version + 1,
):
    raise RuntimeError(
        f"cocotb {__version__} only supports a maximum Python version of 3.{max_python3_minor_version}.\n"
        "You can suppress this error by defining the environment variable COCOTB_IGNORE_PYTHON_REQUIRES\n"
        "There is no guarantee cocotb will work with untested versions of Python and no support will be provided."
    )


def read_file(fname):
    with open(path.join(path.dirname(__file__), fname), encoding="utf8") as f:
        return f.read()


def package_files(directory):
    paths = []
    for fpath, _, filenames in walk(directory):
        for filename in filenames:
            paths.append(path.join("..", "..", fpath, filename))
    return paths


version_file_path = path.join("src", "cocotb", "_version.py")
if "dev" in __version__:
    try:
        rev = subprocess.check_output(
            ["git", "rev-parse", "--short", "HEAD"], universal_newlines=True
        ).strip()
        __version__ += f"+{rev}"
    except Exception as e:
        # if this is not a git repository and _version.py already exists,
        # we are probably installing from an sdist, so use the existing _version.py
        if path.exists(version_file_path):
            exec(read_file(version_file_path))
        else:
            print(e, file=sys.stderr)
with open(version_file_path, "w") as f:
    f.write("# Package version\n")
    f.write("# Generated by setup.py -- do not modify directly\n\n")
    f.write(f'__version__ = "{__version__}"\n')


# store log from build_libs and display at the end in verbose mode
# see https://github.com/pypa/pip/issues/6634
log_stream = StringIO()
handler = logging.StreamHandler(log_stream)
log = logging.getLogger("cocotb_build_libs")
log.setLevel(logging.INFO)
log.addHandler(handler)

setup(
    cmdclass={"build_ext": build_ext},
    version=__version__,
    packages=find_packages(where="src"),
    package_dir={"": "src"},
    package_data={
        "cocotb": (
            package_files("src/cocotb/share/include")
            + package_files("src/cocotb/share/def")
            + package_files("src/cocotb/share/lib/verilator")
        ),
        "cocotb_tools": (package_files("src/cocotb_tools/makefiles")),
    },
    ext_modules=get_ext(),
)

print(log_stream.getvalue())
